//
//  main.c
//  C_14指针开发技巧
//
//  Created by Robin on 16/3/24.
//  Copyright © 2016年 cnbm. All rights reserved.
//

#include <stdio.h>

// 01 用指针实现整数排序
void swap (int *p1,int *p2){
    int temp;
    temp = *p1;
    *p1 = *p2;
    *p2 = temp;
}

void exchange (int *p1,int *p2,int *p3){
    
    if (*p1 > *p2)
        swap(p1, p2);
    if (*p1>*p3)
        swap(p1, p3);
    if (*p2>*p3)
        swap(p2, p3);
    
}

/****************************************
 技巧02 : 使用指针进行数据交换
 ****************************************/


/****************************************
 技巧03:指向结构体的指针
 ****************************************/

struct student {
    int no;     // 学号
    char *name; // 姓名
    char *sex;
    float age;
    int score;
}student;

/****************************************
 技巧03:使用指针输出数组元素
 ****************************************/
void array (){
    
    int a[10];
    int *p,i;
    puts("Please input ten integer:\n");
    for (i=0; i<10; i++) {
        scanf("%d",&a[i]);
    }
    printf("\n");
    for (p=a; p<(a+10); p++) {
        printf("%d\n",*p);
    }
    
}

/****************************************
 技巧11：用指向函数的指针比较大小
 一个函数在编译时被分配一个入口地址，这个地址就称为
 函数的指针。所以可以使用指针变量指向一个函数，然后
 通过该指针变量调用这个函数。
 ****************************************/

int min (int a,int b){
    if (a>b) {
        return b;
    }else
        return a;
}

/****************************************
 技巧12：使用返回指针的函数查找最大值
 ****************************************/



void * Find_Max(int a[],int n){
    int *max,i;
    max = a;
    
    for (i=0; i<n; i++) {
        if (*(a+i) > *max) {
            *max = *(a+i);

        }
    }
    return max;
}

/****************************************
 技巧15：寻找相同元素的指针
 ****************************************/
int *find_same (int *pa,int *pb,int an,int bn){
    int *pta,*ptb;
    pta = pa;ptb = pb;
    
    //int n = an>bn?bn:an;
    if (bn>an) {
        while (pta < pa+an) {
            
            for (int i=0; i<bn; i++) {
                if (*pta==*ptb) {
                    
                    return pta;
                }
                ptb++;
            }
            pta++;
        }
    }else{
        while (ptb < pb+bn) {
            for (int i=0; i<an; i++) {
                
                if (*pta == *ptb) {
                    return ptb;
                }
                pta ++;
            }
            ptb++;
        }
    }
    
    return 0;
}

/****************************************
 技巧16：使用指针的指针输出字符串
 ****************************************/
void testAddressOfAddress(){
    
    char *strings[] = {"guo","hua","bing","cong","ye"};
    int i=0;
    char **p;
    p = strings;
    size_t t_single = sizeof(p[0]);
    size_t all = sizeof(p);
    
    printf("size single is %ld %ld\n",all,t_single);

    for (; i<sizeof(strings)/sizeof(strings[0]); i++) {
        
        printf("%s\n",p[i]);
    }
}

int main(int argc, const char * argv[]) {

    
//    int a,b,c, *p1,*p2,*p3;
//    printf("Please input a,b,c:\n");
//    scanf("%d%d%d",&a,&b,&c);
//    p1 = &a;
//    p2 = &b;
//    p3 = &c;
//    
//    exchange(p1, p2, p3);
//    printf("result is %d %d %d\n",a,b,c);
    
//    struct student me = {1001,"Robin","Boy",25,98};
//    
//    struct student *p;
//    p = &me;
//    
//    printf("student name is %s\n",p->name);
//    printf("student sex is %s\n",p->sex);
//    printf("student age is %f\n",p->age);
//    array();
//    int a,b;
//    printf("please input a,b");
//    scanf("%d%d",&a,&b);
//    int (*pmin)();
//    pmin = min;
//    int m = (*pmin)(a,b);
//    printf("min = %d\n",m);
//    int a[10];
//    printf("Please input ten integer :\n");
//    for (int i=0; i < 10; i++) {
//        scanf("%d",&a[i]);
//    }
//    
//    int *max = Find_Max(a,10);
//    printf("max = %d\n",*max);
    
//    int *p;
//    
//    int a[4] = {10,3,4,5};
//    int b[5] = {12,35,4,7,10};
//    
//    p = find_same(a, b, sizeof(a)/sizeof(a[0]), sizeof(b)/sizeof(b[0]));
//    
//    if (p) {
//        printf("the same element is %d\n",*p);
//    }else
//        printf("there is no same element \n");
    
    testAddressOfAddress();
    
    return 0;
}
